﻿#region License information
/*
 * Smart Include
 *  
 * Copyright (c) 2014 Fredrik Schultz
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 * Project website: http://kaliko.com/smart-include/
 */
#endregion

namespace Kaliko.SmartInclude {
    using System.Collections.Generic;
    using System;
    using System.Configuration;
    using System.IO;
    using System.Web;

    internal class Common {
        /// <summary>
        /// Read parameter from the web.config file.
        /// </summary>
        /// <param name="key">Name of key</param>
        /// <param name="defaultValue">If key not found, return this value as default</param>
        /// <returns></returns>
        internal static string ReadSetting(string key, string defaultValue) {
            try {
                object setting = ConfigurationManager.AppSettings[key];
                if (setting != null && setting.ToString().Length == 0) {
                    setting = null;
                }

                return (setting == null) ? defaultValue : (String)setting;
            }
            catch {
                return defaultValue;
            }
        }

        /// <summary>
        /// Checks if the web browser making the call can handle gziped content
        /// </summary>
        internal static bool IsGzipAccepted {
            get {
                return HttpContext.Current.Request.Headers.Get("Accept-Encoding").Contains("gzip");
            }
        }

        /// <summary>
        /// Checks if any files has been changed since last combine
        /// </summary>
        /// <param name="files">Array with files to combine</param>
        /// <param name="newFile">The file they are combined to</param>
        /// <param name="filepath"></param>
        /// <returns></returns>
        internal static bool HaveFilesBeenChanged(List<string> files, string newFile, string filepath) {
            if(File.Exists(filepath + newFile)) {
                DateTime fileTime = File.GetLastWriteTime(filepath + newFile);

                foreach(string file in files) {
                    if(new FileInfo(HttpContext.Current.Server.MapPath(file)).LastWriteTime > fileTime) {
                        return true;
                    }
                }
                
                return false;
            }
            
            return true;
        }

        /// <summary>
        /// Get the hash code of a files last write time.
        /// </summary>
        /// <param name="filename">File to get write time has for</param>
        /// <returns>Eight char hash code (hex format)</returns>
        internal static string GetFileDateHash(string filename) {
            return File.GetLastWriteTime(filename).GetHashCode().ToString("X").PadLeft(8, '0');
        }

        /// <summary>
        /// Get the hash code of a string.
        /// </summary>
        /// <param name="text">String to be hashed</param>
        /// <returns>Eight char hash code (hex format)</returns>
        internal static string GetStringHash(List<string> text) {
            int hashCode = 0;
            
            foreach (var value in text) {
                hashCode = hashCode ^ value.GetHashCode();
            }
            
            return hashCode.ToString("X").PadLeft(8, '0');
        }

    }
}
